package fr.babos.navigation.routes 
{
	import fr.babos.core.data.collect.DataCollection;
	import fr.babos.core.data.remote.IDataRemote;
	import fr.babos.core.roles.IInitializable;
	import org.osflash.signals.ISignal;
	
	/**
	 * @author ZoulouX
	 */
	public interface IRouter
	{
		/**
		 * Event envoyés :
		 * RouterEvent.STRUCTURE_READY
		 * RouterEvent.STRUCTURE_ERROR
		 * 
		 * RouterEvent.ROUTE_CHANGED
		 * RouterEvent.ROUTE_NOT_FOUND
		 */
		
		/**
		 * Objet statique dans le projet qui contiendrait toutes les commandes
		 */
		//RoutesCommands.VIEW_NEWS_COMMAND = "News.openView";
		
		/**
		 * Ouvrir une commande et donc changer l'URL
		 */
		/*
		Router.open(RoutesCommands.VIEW_NEWS_COMMAND, {
			catid: 5,
			catslug: 'Actualités',
			newsid: 10,
			newsslug: 'Un framework qui defonce' // Slug automatique dans la méthode open
		});
		*/
		
		/**
		 * Lorsque l'URL change
		 */
		function get onURLChange ():ISignal;
		
		/**
		 * Le signal de changement d'URL
		 */
		function get onRouteChange ():ISignal;
		
		/**
		 * Le signal lorsqu'il y a une erreur sur le routage
		 */
		function get onRouteError ():ISignal;
		
		/**
		 * Le signal lorsque les routes sont chargées
		 */
		function get onLoadSuccess ():ISignal;
		
		/**
		 * Le signal lorsqu'il y a une erreur sur la structure
		 */
		function get onLoadError ():ISignal;
		
		/**
		 * La liste des routes
		 */
		function get routes ():DataCollection;
		function set routes (pValue:DataCollection):void;
		
		/**
		 * Récupérer la route courrante. Null si on est sur un 404
		 */
		function get currentRoute ():RouteItem;
		
		/**
		 * Les paramètres de la route en cours
		 */
		function get currentParams():Object;
		
		/**
		 * L'URL active sur le bootstrap
		 */
		function get url ():String;
		function set url (value:String):void;
		
		/**
		 * Si le routeur est démarré
		 */
		function get started ():Boolean;
		
		/**
		 * Charger la structure des routes
		 * @param	pURL : URL de l'objet XML/AMF/JSON contenant les routes
		 */
		function loadRoutes (pURL:String, pRemote:IDataRemote = null, pAutoStart:Boolean = true):void
		
		/**
		 * Démarrer l'écoute du SWFAddress
		 */
		function start ():void
		
		/**
		 * Arrêter l'écoute du SWFAddress
		 */
		function stop ():void
		
		/**
		 * Routage inverse, création d'une URL depuis une commande et ses paramètres nommés.
		 * @param	pCommand : Nom de la commande de base
		 * @param	pParams : Objet dynamique contenant les paramètres nommés
		 * @return : L'URL générée
		 */
		function makeURL (pCommand:String, pParams:Object = null):String
		
		/**
		 * Routage inverse, ouvrir une commande. Cette action va changer l'URL selon la commande et les paramètres nommés.
		 * @param	pCommand : Nom de la commande de base
		 * @param	pParams : Objet dynamique contenant les paramètres nommés
		 */
		function open (pCommand:String, pParams:Object = null):void;
	}
}